/**
 * @author: Gene
 * @age: 永远18岁的美少年
 * @Email： yangjianyun@58.com
 * @date: 2021-11-25 20:31:08
 * @description: Javascript parser JavaScript 源码解析器是通过以下插件实现的
 */
// 它可以把源代码转成 抽象语法树
let esprima = require("esprima")
// 它可以遍历语法树, 修改树上的节点
let estraverse = require("estraverse")
let escodegen = require("escodegen")

let sourceCode = "function ast(){}"
let ast = esprima.parse(sourceCode)
let indent = 0
const padding = () => ``.repeat(indent)
estraverse.traverse(ast, {
    enter(node, parent) {
        console.log(padding() + node.type);
        if (node.type === "FunctionDeclaration") {
            // 可以修改
            node.id.name = "newFunction"
        }
        indent++
    },
    leave(node, parent) {
        indent--
        console.log(padding() + node.type);
    }
})

// 重新生成源代码
let newSourceCode = escodegen.generate(ast)
console.log("新源代码 -->", newSourceCode);